HTTP2.0 在 Nginx 的实践
0. 引言
HTTPS 解决了明文传输的安全问题,却带来了建连次数与性能损耗。HTTP2.0 通过多路复用、头部压缩与服务端推送,在不牺牲安全的前提下大幅提升传输效率。本文介绍 HTTP2.0 协议特性,并演示 Nginx 的支持配置与效果对比。
1. HTTP 协议演进
- HTTP1.1:早期版本,最大的问题是明文传输无法加密,由此引入 HTTPS(SSL 加密传输),但加密解密带来性能损耗和多次建连;
- HTTP2.0:引入 Stream(流)概念,一个 TCP 连接分为若干流,每个流可传输若干消息,通过 I/O 复用机制保障请求响应效率;同时采用 HPACK 机制做头部压缩,服务端建立字典、以增量方式传输报文,减少传送流量;
- HTTP3.0:解决 HTTP2.0 的队头阻塞等缺陷,后文详述。
2. HTTP1.1 的劣势
- 请求阻塞:一个连接同时只能处理一个请求,浏览器按先进先出优先级处理,某个响应未及时返回时,后续请求全部阻塞。前端常用多域名方案缓解,但浏览器对 HTTP1.1 并发连接数有限制,效果有限;
- 明文传输:数据无加密,易被劫持。
3. HTTP2.0 的核心优势
- 多路复用:一个 TCP 连接内同时发送多个请求流,单连接上多请求-响应并行,解决连接阻塞,减少 TCP 连接数量与慢启动损耗;
- 分帧二进制传输:请求流中以数据帧为最小传输单位,基于 HTTPS 解决安全问题;
- 服务端主动推送:浏览器请求一个资源时,服务端主动推送关联资源,减少后续请求。

如上图,客户端请求 stream1(page.html)时,服务端同时响应 stream2、stream4(script.js、style.css),减少多次连接,提升页面响应性能与用户体验。
4. Nginx 配置 HTTP2.0
前提条件:Nginx 版本大于 1.10,openssl 库版本大于 1.0.2。配置方式是在监听端口后加 http2:
server {
listen 443 ssl http2;
charset utf-8;
server_name www.imoocc.com imoocc.com;
access_log /opt/app/jeson/logs/https_access.log main;
error_log /opt/app/jeson/logs/https_error.log;
ssl_certificate /jeson/key/www.imoocc.com.pem;
ssl_certificate_key /jeson/key/www.imoocc.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
...
}配置完成后重启 Nginx。用浏览器开发者工具对比验证:HTTP1.1 场景下 Protocol 栏显示 HTTP/1.1,页面元素串行加载;HTTP2.0 + HTTPS 场景下 Protocol 显示 h2,元素并行加载,即使算上 HTTPS 的额外开销,整体加载速度仍明显优于 HTTP1.1。
5. Nginx 配置服务端推送
服务端推送要求 Nginx 版本大于等于 1.13.9:
server_name www.imoocc.com;
root /test;
index index.html index.htm;
location = /index.html {
http2_push /css/style.css;
http2_push /js/main.js;
http2_push /img/yule.jpg;
http2_push /img/avatar.jpg;
}用户请求 index.html 时,服务端通过 http2_push 主动推送这些资源。浏览器开发者工具中对应元素会以 Push 方式展示,即为服务端主动推送。
6. HTTP3.0 的进一步优化
HTTP3.0 最大特点是支持 QUIC 协议:
- 0RTT 建连:客户端缓存 HTTPS 认证会话信息,再次访问时无需重新建立 HTTPS 会话,直接基于原有认证信息建连;
- 解决队头阻塞:QUIC 不使用 TCP 报文而改用 UDP,一个连接上的多个 stream 之间无依赖,数据包阻塞不影响后续报文传送;
- 弱网重连:TCP 基于 IP 和端口识别连接,弱网环境切换网络时连接易失败;QUIC 通过 ID 识别连接,只要 ID 不变即可迅速重连。
7. 小结
HTTP2.0 在 Nginx 上"一行配置"即可启用(listen 443 ssl http2),便可获得多路复用、二进制分帧、头部压缩与服务端推送四大能力,是投入产出比极高的性能优化手段。注意三点:版本前提(Nginx > 1.10、openssl > 1.0.2)、推送资源要精选(滥用会浪费流量)、弱网或移动端场景可进一步关注 HTTP3.0/QUIC 的连接恢复优势。
下一章讲解系统性能验收,用 Unixbench、FIO 等工具量化评估服务器性能。